import { mapGetters, mapActions } from 'vuex'
import { 
  convertFeelIdsToNames, 
  convertFeelIdsToObjects, 
  convertFeelsToIds,
  parseFeelIds,
  formatFeelDisplay,
  isFeelDataLoaded,
  ensureFeelDataLoaded,
  getFeelOptions,
  ensureFeelListLoaded,
  parseFeelsString,
  buildFeelsString,
  convertFeelsToString
} from '@/utils/feel'

export default {
  computed: {
    ...mapGetters('feel', [
      'feelList',
      'feelLoading',
      'feelTotal',
      'getFeelNameById',
      'getFeelById'
    ])
  },
  methods: {
    ...mapActions('feel', [
      'getFeelList',
      'addFeel',
      'editFeel',
      'deleteFeel',
      'refreshFeelList'
    ]),

    // 工具方法
    convertFeelIdsToNames,
    convertFeelIdsToObjects,
    convertFeelsToIds,
    parseFeelIds,
    formatFeelDisplay,
    isFeelDataLoaded,
    ensureFeelDataLoaded,
    getFeelOptions,

    // 向后兼容的方法
    ensureFeelListLoaded,
    parseFeelsString,
    buildFeelsString,
    convertFeelsToString,

    /**
     * 初始化感受数据
     * @param {boolean} forceRefresh - 是否强制刷新
     */
    async initFeelData(forceRefresh = false) {
      if (forceRefresh || !this.isFeelDataLoaded()) {
        await this.getFeelList()
      }
    },

    /**
     * 获取感受名称（单个ID）
     * @param {number} id - 感受ID
     * @returns {string} 感受名称
     */
    getFeelName(id) {
      return this.getFeelNameById(id) || `未知感受(${id})`
    },

    /**
     * 获取感受对象（单个ID）
     * @param {number} id - 感受ID
     * @returns {object} 感受对象
     */
    getFeel(id) {
      return this.getFeelById(id) || { id, name: `未知感受(${id})` }
    },

    /**
     * 批量获取感受名称
     * @param {Array|string} ids - 感受ID数组或字符串
     * @param {string} separator - 分隔符（当ids为字符串时使用）
     * @returns {Array} 感受名称数组
     */
    getFeelNames(ids, separator = ',') {
      if (typeof ids === 'string') {
        return this.convertFeelIdsToNames(ids, separator).split(separator)
      }
      if (Array.isArray(ids)) {
        return ids.map(id => this.getFeelName(id))
      }
      return []
    },

    /**
     * 批量获取感受对象
     * @param {Array|string} ids - 感受ID数组或字符串
     * @param {string} separator - 分隔符（当ids为字符串时使用）
     * @returns {Array} 感受对象数组
     */
    getFeels(ids, separator = ',') {
      if (typeof ids === 'string') {
        return this.convertFeelIdsToObjects(ids, separator)
      }
      if (Array.isArray(ids)) {
        return ids.map(id => this.getFeel(id))
      }
      return []
    },

    /**
     * 格式化感受显示
     * @param {Array|string} ids - 感受ID数组或字符串
     * @param {string} separator - 分隔符
     * @param {boolean} useHtml - 是否使用HTML格式
     * @returns {string} 格式化后的感受名称
     */
    formatFeels(ids, separator = ',', useHtml = false) {
      if (typeof ids === 'string') {
        return this.formatFeelDisplay(ids, separator, useHtml)
      }
      if (Array.isArray(ids)) {
        const names = ids.map(id => this.getFeelName(id))
        if (useHtml) {
          return names.map(name => `<span class="feel-tag">${name}</span>`).join(' ')
        }
        return names.join(separator)
      }
      return ''
    },

    /**
     * 验证感受ID是否存在
     * @param {number} id - 感受ID
     * @returns {boolean} 是否存在
     */
    isValidFeelId(id) {
      return this.getFeelById(id) !== undefined
    },

    /**
     * 获取感受选项（用于下拉选择）
     * @returns {Array} 选项数组
     */
    getFeelSelectOptions() {
      return this.getFeelOptions()
    }
  }
} 